﻿using IWshRuntimeLibrary;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace SoapNotify.Assistantor
{
    /// <summary>
    /// 快捷方式助手
    /// </summary>
    /// <remarks>
    /// 添加引用 -> com组件 -> Windows Script Host Object Model
    /// 重点是Interop.IWshRuntimeLibrary.dll这个库
    /// </remarks>
    public class ShortcutHelper
    {
        private static readonly Guid CLSID_WshShell = new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8");
        /// <summary>
        /// 创建桌面快捷方式1
        /// </summary>
        /// <param name="isDelete">是否删除已存在的</param>
        /// <param name="FileName">文件的名称</param>
        /// <param name="exePath">EXE文件的全路径</param>
        /// <returns>成功或失败</returns>
        public static bool CreateNewDesktopShortcut(string FileName, string exePath, bool isDelete = false)
        {
            dynamic objWshShell = null, objShortcut = null;
            try
            {
                //获取系统桌面路径
                string linkFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), string.Format("{0}.lnk", FileName));
                if (System.IO.File.Exists(linkFile))  //
                {
                    //是否强制删除
                    if (isDelete)
                    {
                        System.IO.File.Delete(linkFile);//删除原来的桌面快捷键方式
                    }
                    else
                    {
                        FileInfo lnkFile = new FileInfo(linkFile);
                        return true;
                    }
                }
                //实例化WshShell对象
                //IWshRuntimeLibrary.WshShell objWshShell = new IWshRuntimeLibrary.WshShell();
                objWshShell = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_WshShell));

                //创建 IWshShortcut 接口的实例对象 快捷键方式创建的位置、名称
                objShortcut = (IWshShortcut)objWshShell.CreateShortcut(linkFile);
                //IWshShortcut objShortcut = (IWshShortcut)shell.CreateShortcut(linkFile);
                objShortcut.TargetPath = exePath; //目标文件 System.Reflection.Assembly.GetExecutingAssembly().Location;
                //快捷方式属性中的起始位置
                //该属性指定应用程序的工作目录，当用户没有指定一个具体的目录时，快捷方式的目标应用程序将使用该属性所指定的目录来装载或保存文件。
                objShortcut.WorkingDirectory = System.Environment.CurrentDirectory;
                objShortcut.WindowStyle = 1; //目标应用程序的窗口状态分为普通、最大化、最小化【1,3,7】
                objShortcut.Description = FileName; //描述
                //shortcut.IconLocation = Properties.Resources.system;  //自定义快捷方式图标文件路径 不设置将使用程序默认图标
                objShortcut.Arguments = "";  //设置启动参数
                //shortcut.Hotkey = "CTRL+ALT+F11"; // 快捷键
                objShortcut.Save(); //必须调用保存快捷才成创建成功
                return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                Marshal.ReleaseComObject(objShortcut);
                Marshal.ReleaseComObject(objWshShell);
            }
            
        }

        /// <summary>
        /// 判断桌面快捷方式是否存在
        /// </summary>
        /// <param name="fileName">快捷方式名称</param>
        /// <param name="destPath">目标文件全路径</param>
        /// <returns></returns>
        public static bool IsExists(string fileName, string destPath)
        {
            //获取系统桌面路径
            string linkFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), string.Format("{0}.lnk", fileName));
            if (System.IO.File.Exists(linkFile))
            {
                WshShell objWshShell = new WshShell();
                IWshShortcut objShortcut = objWshShell.CreateShortcut(linkFile); ;
                if (!string.IsNullOrEmpty(objShortcut.TargetPath))
                {
                    //快捷方式文件存在时，应检查目标文件路径是不是相同，若相同则判定为文件已存在，不用再次生成快捷方式
                    return destPath.ToLower().Equals(objShortcut.TargetPath.ToLower());
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }
}
